package com.saa.strategy.service;

import com.saa.application.dao.SaaApplicationInfoDao;
import com.saa.application.po.SaaApplicationInfo;
import com.saa.application.pojo.PageBean;
import com.saa.common.utils.CommonUtil;
import com.saa.common.utils.HttpRequestUtil;
import com.saa.common.vo.OmsResultVo;
import com.saa.strategy.dao.SaaStrategyDao;
import com.saa.strategy.po.SaaStrategy;
import com.saa.strategy.util.Strategy;
import com.saa.strategy.vo.SaaStrategyPageVo;
import com.saa.strategy.vo.SaaStrategyVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class SaaStrategyService {
    @Autowired
    private SaaStrategyDao saaStrategyDao;

    @Autowired
    private SaaApplicationInfoDao saaApplicationInfoDao;

    /****查询策略列表***/
    public OmsResultVo queryStrategy(SaaStrategyVo saaStrategyVo) throws Exception {
        long startIndex = (saaStrategyVo.getPage() - 1) * saaStrategyVo.getPageSize();
        Map<String, Object> params = new HashMap<>();
        params.put("startIndex",startIndex);
        params.put("pageSize",saaStrategyVo.getPageSize());
        if(saaStrategyVo.getStrategyType()!=null&&!"".equals(saaStrategyVo.getStrategyType())){
            params.put("strategyType",saaStrategyVo.getStrategyType());
        }
        if(saaStrategyVo.getStrategyValue()!=null&&!"".equals(saaStrategyVo.getStrategyValue())){
            params.put("strategyValue",saaStrategyVo.getStrategyValue());
        }
        params.put("valid",saaStrategyVo.getValid());

        List<SaaStrategyVo> appDeploymentRequestList = saaStrategyDao.selectPage(params);
        List<SaaStrategyPageVo> saaStrategyPageVoList = new ArrayList<SaaStrategyPageVo>();
        for(SaaStrategyVo saaStrategy:appDeploymentRequestList){
            SaaStrategyPageVo saaStrategyPageVo = new SaaStrategyPageVo();
            params = new HashMap<>();
            params.put("strategyId",saaStrategy.getStrategyId());
            params.put("valid",saaStrategyVo.getValid());
            SaaStrategy strategy = saaStrategyDao.selectByPrimaryKey(saaStrategy.getStrategyId());
            if(Strategy.STRATEGYNAME.equals(strategy.getStrategyCode())){
                saaStrategyPageVo.setStrategyId(strategy.getId());
                saaStrategyPageVo.setStrategyName(strategy.getStrategyValue());
            }
            List<SaaStrategyVo> saaStrategyVos = saaStrategyDao.selectByCondition(params);
            for(SaaStrategyVo strategyVo :saaStrategyVos){
                if(Strategy.APP.equals(strategyVo.getStrategyCode())){
                    params = new HashMap<>();
                    params.put("applicationCode",strategyVo.getStrategyValue());
                    params.put("valid",saaStrategyVo.getValid());
                    List<SaaApplicationInfo>  saaApplicationInfos = saaApplicationInfoDao.selectByCondition(params);
                    if(saaApplicationInfos.size()>0){
                        saaStrategyPageVo.setApplicationName(saaApplicationInfos.get(0).getApplicationName());
                    }else{
                        throw new Exception("应用代码:"+strategyVo.getStrategyValue()+"已经停用或未进行注册，请联系运维人员。");
                    }
                }
                if(Strategy.COM.equals(strategyVo.getStrategyCode())){
                    /***机构代码***/

                }
                if(Strategy.GROUP.equals(strategyVo.getStrategyCode())){
                    /***群组代码***/

                }

                if(Strategy.RISK.equals(strategyVo.getStrategyCode())){
                    /***产品代码***/

                }

                if(Strategy.OUTCOM.equals(strategyVo.getStrategyCode())){
                    /***除外机构代码***/

                }

                if(Strategy.OUTRISK.equals(strategyVo.getStrategyCode())){
                    /***除外产品代码***/

                }

                if(Strategy.ROLE.equals(strategyVo.getStrategyCode())){
                    /***角色代码***/

                }

                if(Strategy.POST.equals(strategyVo.getStrategyCode())){
                    /***HR岗位代码***/

                }

                if(Strategy.PRIVILEGE.equals(strategyVo.getStrategyCode())){
                    /***功能权限***/

                }
            }
            saaStrategyPageVoList.add(saaStrategyPageVo);
        }
        Long total = (long) saaStrategyDao.selectByCondition(params).size();
        if(appDeploymentRequestList!=null){
            PageBean pageBean = new PageBean();
            pageBean.setTotal(total);
            pageBean.setRows(saaStrategyPageVoList);
            return OmsResultVo.builder(200, "查询成功", pageBean);
        }else {
            return OmsResultVo.builder(500, "查询失败", null);
        }
    }

    /***查询策略详情***/
    public OmsResultVo queryStrategyDetail(SaaStrategyVo saaStrategyVo) throws Exception {
        SaaStrategyPageVo saaStrategyPageVo = new SaaStrategyPageVo();
        Map<String, Object> params = new HashMap<>();
        params.put("strategyId",saaStrategyVo.getId());
        SaaStrategy strategy = saaStrategyDao.selectByPrimaryKey(saaStrategyVo.getId());
        List<SaaStrategyVo> saaStrategyVos = saaStrategyDao.selectByCondition(params);
        for(SaaStrategyVo strategyVo :saaStrategyVos){
            saaStrategyPageVo.setId(strategy.getId());
            saaStrategyPageVo.setStrategyId(strategy.getId());
            saaStrategyPageVo.setStrategyName(strategy.getStrategyValue());
            if(Strategy.APP.equals(strategyVo.getStrategyCode())){
                params = new HashMap<>();
                params.put("applicationCode",strategyVo.getStrategyValue());
                params.put("valid",saaStrategyVo.getValid());
                List<SaaApplicationInfo>  saaApplicationInfos = saaApplicationInfoDao.selectByCondition(params);
                if(saaApplicationInfos.size()>0){
                    saaStrategyPageVo.setApplicationName(saaApplicationInfos.get(0).getApplicationName());
                }else{
                    throw new Exception("应用代码:"+strategyVo.getStrategyValue()+"已经停用或未进行注册，请联系运维人员。");
                }
            }
            if(Strategy.COM.equals(strategyVo.getStrategyCode())){
                /***机构代码***/

            }
            if(Strategy.GROUP.equals(strategyVo.getStrategyCode())){
                /***群组代码***/

            }

            if(Strategy.RISK.equals(strategyVo.getStrategyCode())){
                /***产品代码***/

            }

            if(Strategy.OUTCOM.equals(strategyVo.getStrategyCode())){
                /***除外机构代码***/

            }

            if(Strategy.OUTRISK.equals(strategyVo.getStrategyCode())){
                /***除外产品代码***/

            }

            if(Strategy.ROLE.equals(strategyVo.getStrategyCode())){
                /***角色代码***/

            }

            if(Strategy.POST.equals(strategyVo.getStrategyCode())){
                /***HR岗位代码***/

            }

            if(Strategy.PRIVILEGE.equals(strategyVo.getStrategyCode())){
                /***功能权限***/

            }
        }
        return OmsResultVo.builder(200,"查询成功",saaStrategyPageVo);
    }
    /***创建策略***/
    public OmsResultVo createStrategyDetail(SaaStrategyPageVo saaStrategyVo) throws Exception {
        SaaStrategy saaStrategy = new SaaStrategy();
        saaStrategy.setId(CommonUtil.getUpperUuid());
        saaStrategy.setStrategyId("");
        saaStrategy.setStrategyCode(Strategy.STRATEGYNAME);
        saaStrategy.setStrategyValue(saaStrategyVo.getStrategyName());
        saaStrategy.setStrategyType(saaStrategyVo.getStrategyType());
        String userCode = HttpRequestUtil.getUserCode();
        saaStrategy.setCreateBy(userCode);
        saaStrategy.setCreateTime(new Date());
        saaStrategy.setUpdateBy(userCode);
        saaStrategy.setUpdateTime(new Date());
        saaStrategy.setValid("1");
        saaStrategyDao.insertSelective(saaStrategy);
        if(saaStrategyVo.getApplicationName()!=null&&!"".equals(saaStrategyVo.getApplicationName())){
            saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.APP,saaStrategyVo.getApplicationName(),saaStrategyVo.getStrategyType(),"1"));
        }
        if(saaStrategyVo.getGroups()!=null&&saaStrategyVo.getGroups().size()>0){
            for(String group:saaStrategyVo.getGroups()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.GROUP,group,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        if(saaStrategyVo.getPrivileges()!=null&&saaStrategyVo.getPrivileges().size()>0){
            for(String privileges:saaStrategyVo.getPrivileges()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.PRIVILEGE,privileges,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        if(saaStrategyVo.getStrategyRole()!=null&&!"".equals(saaStrategyVo.getStrategyRole())){
            saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.POST,saaStrategyVo.getStrategyRole(),saaStrategyVo.getStrategyType(),"1"));
        }
        if(saaStrategyVo.getRoleCode()!=null&&saaStrategyVo.getRoleCode().size()>0){
            for(String roleCode:saaStrategyVo.getRoleCode()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.ROLE,roleCode,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        if(saaStrategyVo.getComCode()!=null&&saaStrategyVo.getComCode().size()>0){
            for(String comCode:saaStrategyVo.getComCode()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.COM,comCode,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        if(saaStrategyVo.getRiskCode()!=null&&saaStrategyVo.getRiskCode().size()>0){
            for(String riskCode:saaStrategyVo.getRiskCode()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.RISK,riskCode,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        if(saaStrategyVo.getOutComCode()!=null&&saaStrategyVo.getOutComCode().size()>0){
            for(String comCode:saaStrategyVo.getOutComCode()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.OUTCOM,comCode,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        if(saaStrategyVo.getOutRiskCode()!=null&&saaStrategyVo.getOutRiskCode().size()>0){
            for(String riskCode:saaStrategyVo.getOutRiskCode()){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.OUTRISK,riskCode,saaStrategyVo.getStrategyType(),"1"));
            }
        }
        return OmsResultVo.builder(200,"查询成功",saaStrategyVo);
    }

    /***为策略赋值***/
    public SaaStrategy getSaaStrategy(String strategyId,
                                      String StrategyCode,String StrategyValue,
                                      String StrategyType,String valid){
        SaaStrategy saaStrategy = new SaaStrategy();
        saaStrategy.setId(CommonUtil.getUpperUuid());
        saaStrategy.setStrategyId(strategyId);
        saaStrategy.setStrategyCode(StrategyCode);
        saaStrategy.setStrategyValue(StrategyValue);
        saaStrategy.setStrategyType(StrategyType);
        String userCode = HttpRequestUtil.getUserCode();
        saaStrategy.setCreateBy(userCode);
        saaStrategy.setCreateTime(new Date());
        saaStrategy.setUpdateBy(userCode);
        saaStrategy.setUpdateTime(new Date());
        saaStrategy.setValid(valid);
        return saaStrategy;
    }

    /***修改策略***/
    public OmsResultVo updateStrategyDetail(SaaStrategyPageVo saaStrategyVo) throws Exception {
        if(saaStrategyVo.getId()!=null&&!"".equals(saaStrategyVo.getId())){
            /****先删除策略**/
            Map<String, Object> params = new HashMap<>();
            params.put("strategyId",saaStrategyVo.getStrategyId());
            saaStrategyDao.deleteByPrimaryKey(saaStrategyVo.getId());
            List<SaaStrategyVo> saaStrategyVos = saaStrategyDao.selectByCondition(params);
            for(SaaStrategyVo saaStrategy:saaStrategyVos){
                saaStrategyDao.deleteByPrimaryKey(saaStrategy.getId());
            }
            /***在重新插入***/
            SaaStrategy saaStrategy = new SaaStrategy();
            saaStrategy.setId(CommonUtil.getUpperUuid());
            saaStrategy.setStrategyId("");
            saaStrategy.setStrategyCode(Strategy.STRATEGYNAME);
            saaStrategy.setStrategyValue(saaStrategyVo.getStrategyName());
            saaStrategy.setStrategyType(saaStrategyVo.getStrategyType());
            String userCode = HttpRequestUtil.getUserCode();
            saaStrategy.setCreateBy(userCode);
            saaStrategy.setCreateTime(new Date());
            saaStrategy.setUpdateBy(userCode);
            saaStrategy.setUpdateTime(new Date());
            saaStrategy.setValid(saaStrategyVo.getValid());
            saaStrategyDao.insertSelective(saaStrategy);
            if(saaStrategyVo.getApplicationName()!=null&&!"".equals(saaStrategyVo.getApplicationName())){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.APP,saaStrategyVo.getApplicationName(),saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
            }
            if(saaStrategyVo.getGroups()!=null&&saaStrategyVo.getGroups().size()>0){
                for(String group:saaStrategyVo.getGroups()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.GROUP,group,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
            if(saaStrategyVo.getPrivileges()!=null&&saaStrategyVo.getPrivileges().size()>0){
                for(String privileges:saaStrategyVo.getPrivileges()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.PRIVILEGE,privileges,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
            if(saaStrategyVo.getStrategyRole()!=null&&!"".equals(saaStrategyVo.getStrategyRole())){
                saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.POST,saaStrategyVo.getStrategyRole(),saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
            }
            if(saaStrategyVo.getRoleCode()!=null&&saaStrategyVo.getRoleCode().size()>0){
                for(String roleCode:saaStrategyVo.getRoleCode()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.ROLE,roleCode,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
            if(saaStrategyVo.getComCode()!=null&&saaStrategyVo.getComCode().size()>0){
                for(String comCode:saaStrategyVo.getComCode()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.COM,comCode,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
            if(saaStrategyVo.getRiskCode()!=null&&saaStrategyVo.getRiskCode().size()>0){
                for(String riskCode:saaStrategyVo.getRiskCode()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.RISK,riskCode,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
            if(saaStrategyVo.getOutComCode()!=null&&saaStrategyVo.getOutComCode().size()>0){
                for(String comCode:saaStrategyVo.getOutComCode()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.OUTCOM,comCode,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
            if(saaStrategyVo.getOutRiskCode()!=null&&saaStrategyVo.getOutRiskCode().size()>0){
                for(String riskCode:saaStrategyVo.getOutRiskCode()){
                    saaStrategyDao.insertSelective(this.getSaaStrategy(saaStrategy.getId(),Strategy.OUTRISK,riskCode,saaStrategyVo.getStrategyType(),saaStrategyVo.getValid()));
                }
            }
        }else{
            throw new Exception("策略ID未空，无法进行修改，请联系运维人员。");
        }
        return OmsResultVo.builder(200,"查询成功",saaStrategyVo);
    }
}
